home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 May: Tool Chest / Developer CD Series Tool Chest (Apple Computer)(May 1999).iso / Tool Chest / Hardware / OpenFWBridgeFixJul97 / Extension.a < prev    next >
Encoding:
Text File  |  1997-12-04  |  24.6 KB  |  481 lines  |  [TEXT/MPS ]

  1. ;
  2. ;    File:            Extension.a
  3. ;
  4. ;    Contains:        Extension main entry point code that implements some bug fixes for OpenFirmware
  5. ;                    on certain machines.
  6. ;
  7. ;    Version:        1
  8. ;
  9. ;    Written by:        Ben Koning
  10. ;
  11. ;    Copyright:        © 1997 by Apple Computer, Inc., all rights reserved.
  12. ;
  13. ;    File Ownership:
  14. ;
  15. ;        DRI:                None
  16. ;
  17. ;        Other Contact:        Ben Koning
  18. ;
  19. ;        Technology:            MacOS System 7
  20. ;
  21. ;    Writers:
  22. ;
  23. ;        (BAK)    Ben Koning
  24. ;
  25. ;    Change History (most recent first):
  26. ;
  27. ;         <8>      9/4/97    BAK        Change embedded credit comment.
  28. ;         <7>     7/21/97    BAK        Make this extension "load" on all Zanzibar - project derivative
  29. ;                                    machines as named in GestaltPriv.i, not just machine #514.
  30. ;         <6>     7/16/97    BAK        Fix branch size.
  31. ;         <5>     7/16/97    BAK        Add to credits; add comment if we should do our own checksum to
  32. ;                                    see if NVRAM is virgin or not and patch only if so.
  33. ;         <4>     7/15/97    BAK        Fixing param passing to ExpMgrWriteNVRAMByte call.
  34. ;         <3>     7/10/97    BAK        Filled patch byte array with actual bug fix.  Still doesn't do
  35. ;                                    any checking if we already patched; it just does it every time.
  36. ;         <2>      7/9/97    BAK        Code to loop thru NVRAM $1800..$1FFF dumping an array of bytes.
  37. ;                                    No other whether to do it checking yet other than machine
  38. ;                                    gestalt.
  39. ;         <1>      7/1/97    BAK        First checkin.
  40. ;
  41.  
  42.  
  43.  
  44. ; Select options that include files use to determine what to do:
  45. SystemSevenOrLater        EQU 1
  46.     
  47.  
  48.  
  49. ; Standard API include files from MPW:
  50.                         PRINT OFF
  51.                         INCLUDE 'Types.a'
  52.                         INCLUDE    'Memory.a'
  53.                         INCLUDE    'Files.a'
  54.                         INCLUDE 'Devices.a'
  55.                         INCLUDE    'Resources.a'
  56.                         INCLUDE    'Timer.a'
  57.                         INCLUDE 'Retrace.a'
  58.                         INCLUDE 'Power.a'
  59.                         INCLUDE    'Gestalt.a'
  60.                         INCLUDE 'QuickDraw.a'
  61.                         INCLUDE 'Icons.a'
  62.                         PRINT ON
  63.  
  64.  
  65.  
  66. ; The definitions that follow have been taken out of private include files
  67. ; for the driver and/or the system software; instead of including many cascading
  68. ; include files, since this software is one-off only and it is much more
  69. ; important that we specify unchanging values:
  70.  
  71. LowMemInitIconX            EQU            $92C                ; horizontal coordinate for next enabler icon
  72. LowMemInitIconY            EQU            $92A                ; vertical coordinate for next enabler icon
  73. LowMemInitIconCkX        EQU            $92E                ; complement of X coordinate for is-inited detection
  74. LowMemInitIconCkY        EQU            $928                ; complement of Y coordinate for is-inited detection
  75.  
  76.  
  77.  
  78. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  79.  
  80.  
  81.  
  82. ; Set code generation options and declare start of code:
  83.             MACHINE    MC68020
  84.             BLANKS    ON
  85.             STRING    PASCAL
  86.             MAIN
  87.  
  88.  
  89.  
  90. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  91.  
  92.  
  93.  
  94. ; Include a header of embedded text:
  95.             bra        @EndOfText
  96.             dc.b    'OpenFW Bug Fix for PowerMac 44xx. Bug #1660103. Fixes loading'
  97.             dc.b    ' wrong code for PCI-PCI bridges by modifying byte-load-file'
  98.             dc.b    ' id matching algorithm.  Huffman, Koning, Flansburg, Phillips,'
  99.             dc.b    ' Gross, Sheet, Hall. (C) Sep-97 Apple Computer.'
  100.             dc.b    ' .'
  101.             align    2
  102. @EndOfText
  103.             
  104. ; Save registers for later restore:
  105.             movem.l    a0-a5/d0-d7,-(sp)
  106.  
  107.  
  108.  
  109. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  110.  
  111.  
  112.  
  113. ; Check if we are on a machine on which the bug was reported, exit if not;
  114. ; there may be problems on other machines but we will be very conservative:
  115.             move.l    #gestaltMachineType,d0                ; which machine are we?
  116.             _Gestalt                                    ; find out
  117.             cmp.l    #514,a0                                ; match for specific machines
  118.             beq.s    @DnCkMach                            ; that need this fix; these are
  119.             cmp.l    #515,a0                                ; all "Zanzibar" derivatives
  120.             beq.s    @DnCkMach                            ; (PowerMac 44xx series,
  121.             cmp.l    #516,a0                                ; Motorola StarMax, etc)
  122.             beq.s    @DnCkMach
  123.             cmp.l    #517,a0
  124.             beq.s    @DnCkMach
  125.             cmp.l    #518,a0
  126.             beq.s    @DnCkMach
  127.             cmp.l    #519,a0
  128.             beq.s    @DnCkMach
  129.             bra.s    ExitExtension                        ; exit this entire Extension if none of these
  130. @DnCkMach
  131.             
  132. ; Check if the version of system software we are running on is not too old to
  133. ; be ancient yet not too advanced to have the bug fix already; exit if so;
  134. ; we only let through without exit if between-and-including 7.1.0 to 8.0.0:
  135.             move.l    #gestaltSystemVersion,d0            ; what system software is running?
  136.             _Gestalt                                    ; find out
  137.             move.l    a0,d0                                ; get it in D0
  138.             and.l    #$FFF,d0                            ; mask out anything but low 3 digits
  139.             cmp.l    #$710,d0                            ; we want >= SSW version 7.1.0
  140.             bcs.s    ExitExtension                        ; branch if unsigned-less-than
  141.             cmp.l    #$800,d0                            ; we also want <= SSW version 8.0.0
  142.             bhi.s    ExitExtension                        ; branch if unsigned-greater-than
  143.                         
  144. ; Only if we reach this far, draw the Extension icon on the "INIT Parade" during boot:
  145.             bsr.s    ShowExtensionIcon
  146.  
  147.  
  148.  
  149. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  150.  
  151.  
  152.  
  153. ;
  154. ; At this point, we should probably put code to calculate a checksum on our
  155. ; NVRAM area and compare it with a hardcoded checksum of what we would see if
  156. ; the area was completely virgin (ie, after CMD-OPT-P-R boot).  Only if the
  157. ; area was virgin would we then proceed with the patch.  This means that if
  158. ; any options were set as non-default or especially if (another) patch were
  159. ; already in there, we would not apply our patch.
  160. ;
  161.             ; move.w  #$022E,D0                            ; pascal UInt8 ExpMgrReadNVRAMByte (UInt32 long address)
  162.             ; dc.w    $AAF3                                ; _ExpMgrReadNVRAMByte
  163.  
  164.  
  165.  
  166. ;
  167. ; Write the contents of our data array to the appropriate NVRAM area; this will
  168. ; include the embedded checksum.
  169. ;            
  170.             lea.l    DataToPatch,a3                        ; Address and incrementing index into our data array.
  171.             move.l    #$1800,d7                            ; Start of NVRAM-addresses where patches are put.
  172. @WriteLoop
  173.             move.b    (a3)+,d0                            ; Get a byte of our patch data and bump index into our array.
  174.             
  175.             asl.w    #8,d0                                ; Move it into hi-8 bits for param passing as 16-bit word.
  176.             and.w    #$FF00,d0                            ; And clean the lo-8 bits up.
  177.             move.l    d7,-(sp)                            ; Pass NVRAM-address.
  178.             move.w    d0,-(sp)                            ; Pass data byte imbedded in a word.
  179.             move.w  #$032F,d0                            ; pascal void ExpMgrWriteNVRAMByte (UInt32 address, UInt8 data).
  180.             dc.w    $AAF3                                ; _ExpMgrDispatch.
  181.             
  182.             addq.l    #1,d7                                ; Bump NVRAM-address pointer.
  183.             cmp.l    #(($1FFF)+1),d7                        ; (End)+1 of NVRAM-addresses where patches are put.
  184.             bne.s    @WriteLoop                            ; Loop to fill from our array.
  185.  
  186.  
  187.  
  188. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  189.  
  190.  
  191.  
  192. ExitExtension                                            ; Restore registers and exit from this Extension back to system.
  193.             movem.l    (sp)+,a0-a5/d0-d7
  194.             rts
  195.  
  196.  
  197.  
  198. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  199.  
  200.  
  201.  
  202. ShowExtensionIcon
  203. ;
  204. ; This routine adds our Extension icon to the "Init Parade" of icons shown
  205. ; during boot.  All Extensions have to draw their own icons; the position of
  206. ; the icons revolves around four low mem global values that hold the next
  207. ; available X,Y coordinates and checksum/complement values for them to assume
  208. ; validity since nobody, apparently not even the System, initializes them.
  209. ; Furthermore, since Extensions are INITs which have no 68K runtime world,
  210. ; this must be temporarily created for the use of QuickDraw calls, etc.
  211. ;
  212.  
  213. ; Save registers:
  214.             movem.l        d0-d2/a0/a5,-(sp)
  215.             
  216. ; Init our own QD global world with A5 so we can use QuickDraw and Icon calls:
  217.             lea.l        QDGlobalsPtr,a5
  218.             lea.l        QDGlobalsStorage,a0
  219.             add.l        #QDGlobals.thePort,a0
  220.             move.l        a0,-(sp)
  221.             _InitGraf
  222.             
  223. ; Check, and if necessary, initialize global X,Y positions for the icon if the
  224. ; checksum values are not OK.  Note that since we possibly manipulate the X,Y
  225. ; values here and later in this routine, it is necessary to update the checksum
  226. ; values before exiting this routine:
  227.             move.w        LowMemInitIconX,d0
  228.             bsr            CalcInitIconPosnCk
  229.             cmp.w        LowMemInitIconCkX,d0
  230.             beq.s        @DnCkFixX
  231.             move.w        #8,LowMemInitIconX
  232. @DnCkFixX
  233.             move.w        LowMemInitIconY,d0
  234.             bsr            CalcInitIconPosnCk
  235.             cmp.w        LowMemInitIconCkY,d0
  236.             beq.s        @DnCkFixY
  237.             lea.l        QDGlobalsStorage,a0
  238.             move.w        QDGlobals.screenBits.bounds.bottom(a0),d0
  239.             sub.w        #40,d0
  240.             move.w        d0,LowMemInitIconY
  241. @DnCkFixY
  242.             
  243. ; Check, and if necessary, wrap-around the global X,Y positions for the icon
  244. ; parade if it threatens to run off the right hand side of the screen.  If so,
  245. ; reset back to the right and go up one row of icons:
  246.             move.w        LowMemInitIconX,d0
  247.             add.w        #34,d0
  248.             lea.l        QDGlobalsStorage,a0
  249.             cmp.w        QDGlobals.screenBits.bounds.right(a0),d0
  250.             ble.s        @DnCkWrap
  251.             move.w        #8,LowMemInitIconX
  252.             sub.w        #40,LowMemInitIconY
  253. @DnCkWrap
  254.             
  255. ; Draw our icon using the current global X,Y positions:
  256.             lea.l        IconRectStorage,a0
  257.             
  258.             move.w        LowMemInitIconX,d0
  259.             move.w        d0,Rect.left(a0)
  260.             add.w        #32,d0
  261.             move.w        d0,Rect.right(a0)
  262.             
  263.             move.w        LowMemInitIconY,d0
  264.             move.w        d0,Rect.top(a0)
  265.             add.w        #32,d0
  266.             move.w        d0,Rect.bottom(a0)
  267.             
  268.             lea.l        CPortStorage,a0                    ; pass CGrafPortPtr (of CGrafPort space to be initted)
  269.             move.l        a0,-(sp)
  270.             _OpenCPort
  271.             
  272.             lea.l        IconRectStorage,a0                ; pass theRectPtr
  273.             move.l        a0,-(sp)
  274.             move.w        #atNone,-(sp)                    ; pass the IconAlignmentType of default
  275.             move.w        #ttNone,-(sp)                    ; pass the IconTransformType of default
  276.             move.w        #-16455,-(sp)                    ; pass the theResID of our "Finder Special Icon" icon-family
  277.             _PlotIconID
  278.             
  279.             lea.l        CPortStorage,a0                    ; pass CGrafPortPtr
  280.             move.l        a0,-(sp)
  281.             _CloseCPort
  282.             
  283. ; Advance to next X position for the icon following us:
  284.             add.w        #40,LowMemInitIconX
  285.             
  286. ; Because we have most likely manipulated the global X,Y next-extension-icon coordinates
  287. ; without updating their respective checksums, we need to do this now before exiting:
  288.             move.w        LowMemInitIconX,d0
  289.             bsr            CalcInitIconPosnCk
  290.             move.w        d0,LowMemInitIconCkX
  291.             
  292.             move.w        LowMemInitIconY,d0
  293.             bsr            CalcInitIconPosnCk
  294.             move.w        d0,LowMemInitIconCkY
  295.             
  296. ; Restore registers and exit this routine:
  297.             movem.l        (sp)+,d0-d2/a0/a5
  298.             rts
  299.  
  300.  
  301.  
  302. ;
  303. ; Variables used by us.  These are self-modified here in this code section;
  304. ; note that that makes us non-ROM-able:
  305. ;
  306. QDGlobalsStorage    ds.b    QDGlobals.sizeof
  307. QDGlobalsPtr        dc.l    0
  308. CPortStorage        ds.b    CGrafPort.sizeof
  309. IconRectStorage        ds.b    Rect
  310.  
  311.  
  312.  
  313. CalcInitIconPosnCk
  314. ;
  315. ; INPUT:    D0.W    (high 16-bits ignored)
  316. ; OUTPUT:    D0.L    (low 16-bits significant; high 16-bits cleared)
  317. ;
  318. ; ACTION:    This routine calculates the special "checksum" complement of
  319. ;            the given extension (init) icon coordinate for the purposes
  320. ;            of is-first-and-do-we-need-to-init purposes.
  321. ;
  322.             movem.l        d1/d2,-(sp)                        ; save registers; D0 is input
  323.             clr.l        d2                                ; clear accumulator to zeros
  324.             move.w        d0,d1                            ; get input "x"
  325.             asl.w        #1,d1                            ; make it x << 1
  326.             or.w        d1,d2                            ; or it into our accumlator
  327.             move.w        d0,d1                            ; get input "x"
  328.             lsr.w        #8,d1                            ; make it x >> 8
  329.             lsr.w        #7,d1                            ; now it is x >> 15
  330.             or.w        d1,d2                            ; or it into our accumulator
  331.             eor.w        #$1021,d2                        ; xor our accumulator with 0x1021
  332.             move.w        d2,d0                            ; put accumlated result in D0
  333.             movem.l        (sp)+,d1/d2                        ; restore registers; D0 is output
  334.             rts                                            ; and leave
  335.  
  336.  
  337.  
  338. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  339.  
  340. ;
  341. ; Data array that is written to the NVRAM Open Firmware patch area:
  342. ;
  343. DataToPatch        ; 2048 ($800) bytes, 16 per row.
  344.  
  345.             dc.b  $12, $75, $05, $08, $CA, $1A, $18, $5C, $1F, $96, $00, $00, $21, $00, $00, $00  ; •u•• ••\•ñ••!•••
  346.             dc.b  $FF, $FF, $FF, $FF, $00, $10, $00, $00, $FF, $FF, $FF, $FF, $00, $10, $00, $00  ; ••••••••••••••••
  347.             dc.b  $00, $00, $40, $00, $FF, $FF, $FF, $FF, $00, $00, $00, $64, $00, $00, $00, $28  ; ••@••••••••d•••(
  348.             dc.b  $00, $00, $00, $00, $1F, $F7, $00, $09, $1F, $F7, $00, $00, $1F, $EF, $00, $08  ; ••••••••••••••••
  349.             dc.b  $1F, $EF, $00, $00, $1F, $EB, $00, $04, $1F, $E7, $00, $04, $1F, $E7, $00, $00  ; ••••••••••••••••
  350.             dc.b  $1F, $E7, $00, $00, $1F, $96, $00, $4D, $1F, $E3, $00, $04, $00, $00, $00, $00  ; •••••ñ•M••••••••
  351.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  352.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  353.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  354.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  355.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  356.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  357.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  358.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  359.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  360.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  361.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  362.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  363.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  364.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  365.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  366.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  367.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  368.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  369.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  370.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  371.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  372.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  373.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  374.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  375.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  376.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  377.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  378.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  379.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  380.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  381.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  382.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  383.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  384.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  385.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  386.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  387.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  388.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  389.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  390.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  391.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  392.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  393.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  394.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  395.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  396.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  397.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  398.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  399.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  400.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  401.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  402.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  403.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  404.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  405.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  406.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  407.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  408.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  409.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  410.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  411.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  412.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  413.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  414.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  415.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  416.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  417.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  418.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  419.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  420.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  421.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  422.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  423.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  424.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  425.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  426.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  427.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  428.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  429.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  430.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  431.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  432.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  433.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  434.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  435.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  436.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  437.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  438.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  439.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  440.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  441.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  442.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  443.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  444.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  445.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  446.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  447.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  448.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  449.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  450.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  451.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  452.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  453.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  454.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  455.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  456.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  457.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  458.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  459.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  460.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  461.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  462.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  463.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  464.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  465.             dc.b  $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00  ; ••••••••••••••••
  466.             dc.b  $00, $00, $00, $00, $00, $00, $27, $20, $62, $79, $74, $65, $2D, $6C, $6F, $61  ; ••••••' byte-loa
  467.             dc.b  $64, $2D, $66, $69, $6C, $65, $20, $64, $20, $6E, $61, $2B, $20, $20, $27, $20  ; d-file d na+  ' 
  468.             dc.b  $6F, $72, $20, $20, $62, $6C, $70, $61, $74, $63, $68, $20, $20, $27, $20, $62  ; or  blpatch  ' b
  469.             dc.b  $79, $74, $65, $2D, $6C, $6F, $61, $64, $2D, $66, $69, $6C, $65, $3F, $20, $64  ; yte-load-file? d
  470.             dc.b  $20, $6E, $61, $2B, $20, $20, $27, $20, $6F, $72, $20, $20, $62, $6C, $70, $61  ;  na+  ' or  blpa
  471.             dc.b  $74, $63, $68, $62, $6F, $6F, $74, $74, $74, $79, $61, $74, $74, $79, $61, $66  ; tchbootttyattyaf
  472.             dc.b  $64, $3A, $64, $69, $61, $67, $73, $2F, $41, $41, $50, $4C, $2C, $52, $4F, $4D  ; d:diags/AAPL,ROM
  473.  
  474.  
  475.  
  476. ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
  477.  
  478. ; Declare end of code generation:
  479.             END
  480.  
  481.